package cn.tsunami.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

/**
 * @Classname TimeUtil
 * @Description TODO 时间类工具类
 * @Date 2023/7/12 15:58
 * @Created by lx
 */
public class TimeUtil {

    /**
     * 用代码讲原因系列
     * 最准确的获取当前一周开始时间和结束时间
     * 方法1：getCurrentWeekTimeFrame  获取星期日作为一周的第一天的起始时间和结束时间
     * 方法2：getCurrentWeekTimeFrame2 获取星期一作为一周的第一天的起始时间和结束时间
     */
    /**
     * 获取星期日作为一周的第一天的起始时间和结束时间
     * @return
     */
    public static long[] getCurrentWeekTimeFrame() {

        Calendar calendar = Calendar.getInstance(); //获取当前时间
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); //设置时区为中国区 东8区
        //start of the week
        calendar.add(Calendar.DAY_OF_WEEK, -(calendar.get(Calendar.DAY_OF_WEEK) - 1)); //获取当前是周几-当前周几-1 就可以得到这周的星期日的时间
        calendar.set(Calendar.HOUR_OF_DAY, 0); //设置时间为 0时
        calendar.set(Calendar.MINUTE, 0); // 设置分钟为 0分
        calendar.set(Calendar.SECOND, 0); // 设置秒为 0秒
        calendar.set(Calendar.MILLISECOND, 0); // 设置毫秒为 0毫秒，注意这个一定要设置，否则会出现与显示时间差点
        long startTime = calendar.getTimeInMillis(); //获取到本周第一天（星期日）的开始时间
        //end of the week
        calendar.add(Calendar.DAY_OF_WEEK, 6); //当前本周第一天（星期日）的开始时间加6天就是本周的最后一天
        calendar.set(Calendar.HOUR_OF_DAY, 23);//设置时间为 23时
        calendar.set(Calendar.MINUTE, 59);// 设置分钟为 59分
        calendar.set(Calendar.SECOND, 59);// 设置秒为 59秒
        calendar.set(Calendar.MILLISECOND, 999);// 设置毫秒为 999毫秒
        long endTime = calendar.getTimeInMillis(); //获取到本周最后一天的结束时间，差一毫秒到第二天
        return new long[]{startTime, endTime}; //数组输出开始时间和结束时间

    }

    /**
     * 获取星期一作为一周的第一天的起始时间和结束时间
     * @return
     */
    public static long[] getCurrentWeekTimeFrame2() {

        Calendar calendar = Calendar.getInstance();//获取当前时间
        calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); //设置时区为中国区 东8区
        //start of the week
        if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { //如果当前星期为星期日
           calendar.add(Calendar.DAY_OF_YEAR,-1);//获取当前是一年的第几天-1，及为上一个日历天
        }
        calendar.add(Calendar.DAY_OF_WEEK, -(calendar.get(Calendar.DAY_OF_WEEK) - 2));//获取当前是周几-当前周几-2,因为是星期一作为第一天，星期日作为最后一天
        calendar.set(Calendar.HOUR_OF_DAY, 0); //设置时间为 0时
        calendar.set(Calendar.MINUTE, 0); // 设置分钟为 0分
        calendar.set(Calendar.SECOND, 0); // 设置秒为 0秒
        calendar.set(Calendar.MILLISECOND, 0); // 设置毫秒为 0毫秒，注意这个一定要设置，否则会出现与显示时间差点
        long startTime = calendar.getTimeInMillis(); //获取到本周第一天（星期一）的开始时间
        //end of the week
        calendar.add(Calendar.DAY_OF_WEEK, 6);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        long endTime = calendar.getTimeInMillis();
        return new long[]{startTime, endTime};
    }

    /**
     * long型转换为日期时间型
     *
     * @param longtime
     * @return
     */
    public static Date getTimeYMDHHmmss(long longtime) throws ParseException {
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //定义时间转换格式
        //long转Date
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sd.format(new Date(longtime)));//long数据转为时间，在对时间进行格式化
        return date;
    }

    /**
     * 在指定时间上增加m小时
     * @param date 输入的指定时间
     * @param m 增加的时间
     * @return
     */
    public static Date addDateMinute(Date date,int m){
        Calendar cal = Calendar.getInstance(); //定义日历类
        cal.setTime(date); //设置时间为传入的时间
        cal.add(Calendar.MINUTE,m);//在小时上增加指定的时间（24小时制）
        date = cal.getTime(); //获取到新的时间
        return date;
    }

    /**
     * 字符串时间转LocalDateTime
     * @param dateTime
     * @return
     */
    public static LocalDateTime StringToJava8Time(String dateTime){
        if(StringUtils.isNotEmpty(dateTime)){  //首先判断传入的值是否为空，不空才可继续执行
            if(dateTime.contains("T")){ //判断传入的时间中是否包含T，Tjava8 LocalDateTime中独有的格式
                DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); //有T定义带T的时间转换格式
                return LocalDateTime.parse(dateTime,df); //使用LocalDateTime对格式化的时间进行转换
            }else{
                DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//没有T定义时间转换格式
                return LocalDateTime.parse(dateTime,df);//使用LocalDateTime对格式化的时间进行转换
            }
        }
        return null;
    }

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
//        Date date = sdf.parse("2023-07-16");
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(date);
//        int i = calendar.get(Calendar.DAY_OF_WEEK); //周日为第一天
//        System.out.println(i);
        long[] l1 = getCurrentWeekTimeFrame();
        long[] l2 = getCurrentWeekTimeFrame2();
       Date date = getTimeYMDHHmmss(l1[0]);
       Date date1 = getTimeYMDHHmmss(l1[1]);
       Date date2 = getTimeYMDHHmmss(l2[0]);
       Date date3 = getTimeYMDHHmmss(l2[1]);
        System.out.println(date+"--"+date1+"=="+date2+"--"+date3);
    }
}
